package lv.servidordisqueria.domain;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import lv.mensajeriadisqueria.idomain.IColeccion;
import lv.mensajeriadisqueria.idomain.IDisco;
import lv.mensajeriadisqueria.idomain.IEstilo;
import lv.mensajeriadisqueria.idomain.IIngeniero;
import lv.mensajeriadisqueria.idomain.ITipoSoporte;
import lv.mensajeriadisqueria.idomain.ITversion;

import org.hibernate.annotations.Type;

/**
 * Es la clase con cual se mapea con la tabla DISCO de la
 * base de datos
 */
@Entity
@Table(name = "DISCO")
public class Disco extends Domain implements IDisco {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -1348594899675549289L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ID_DISCO")
	private Integer idDisco;
	
	@Column(name = "NOMBRE")
	private String nombre;
	
	@Column(name = "DESCRIPCION_CONTENIDO")
	private String descripcionContenido;
	
	@Column(name = "DESCRIPCION_AUTOR")
	private String descripcionAutor;
	
	@Column(name = "COMPANIA")
	private String compania;
	
	@Column(name = "ANIO_EDICION")
	private Integer anioEdicion;
	
	@Column(name = "PAIS")
	private String pais;
	
	@ManyToOne(targetEntity = Estilo.class, 
			cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
	@JoinColumn(name = "ID_ESTILO")
	private IEstilo iEstilo;
	
	@ManyToOne(targetEntity = TipoSoporte.class, 
			cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
	@JoinColumn(name = "ID_TIPO_SOPORTE")
	private ITipoSoporte iTipoSoporte;
	
	@Column(name = "VIDEO")
	private Boolean video;
	
	@Column(name = "LEYENDA")
	private String leyenda;
	
	@Column(name = "OBRA_CONCEPTUAL")
	private Boolean obraConceptual;
	
	@ManyToOne(targetEntity = Coleccion.class, fetch = FetchType.LAZY, 
			cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
	@JoinColumn(name = "ID_COLECCION")
	private IColeccion coleccion;
	
	@Column(name = "UBICACION")
	private String ubicacion;
	
	@ManyToMany(targetEntity = Ingeniero.class, fetch = FetchType.LAZY,
			cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
	@JoinTable(name="RELACION_INGENIERO_DISCO", joinColumns=@JoinColumn(name="ID_DISCO"),
			inverseJoinColumns=@JoinColumn(name="ID_INGENIERO"))
	private List<IIngeniero> ingenieros;
	
	@ManyToMany(targetEntity = Tversion.class, fetch = FetchType.LAZY,
			cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
	@JoinTable(name="RELACION_VERSION_DISCO", joinColumns=@JoinColumn(name="ID_DISCO"),
			inverseJoinColumns=@JoinColumn(name="ID_TVERSION"))
	private List<ITversion> versiones;
	
	public Disco(){}
	
	public Disco(String nombre, String descripcionContenido,
			String descripcionAutor, String compania, Integer anioEdicion,
			String pais, IEstilo iEstilo, ITipoSoporte iTipoSoporte, Boolean video,
			String leyenda, Boolean obraConceptual, IColeccion iColeccion,
			String ubicacion) {
		super();
		this.nombre = nombre;
		this.descripcionContenido = descripcionContenido;
		this.descripcionAutor = descripcionAutor;
		this.compania = compania;
		this.anioEdicion = anioEdicion;
		this.pais = pais;
		this.iEstilo = iEstilo;
		this.iTipoSoporte = iTipoSoporte;
		this.video = video;
		this.leyenda = leyenda;
		this.obraConceptual = obraConceptual;
		this.coleccion = iColeccion;
		this.ubicacion = ubicacion;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDescripcionContenido() {
		return descripcionContenido;
	}

	public void setDescripcionContenido(String descripcionContenido) {
		this.descripcionContenido = descripcionContenido;
	}

	public String getDescripcionAutor() {
		return descripcionAutor;
	}

	public void setDescripcionAutor(String descripcionAutor) {
		this.descripcionAutor = descripcionAutor;
	}

	public String getCompania() {
		return compania;
	}

	public void setCompania(String compania) {
		this.compania = compania;
	}

	public Integer getAnioEdicion() {
		return anioEdicion;
	}

	public void setAnioEdicion(Integer anioEdicion) {
		this.anioEdicion = anioEdicion;
	}

	public String getPais() {
		return pais;
	}

	public void setPais(String pais) {
		this.pais = pais;
	}

	public IEstilo getEstilo() {
		return iEstilo;
	}

	public void setEstilo(IEstilo iEstilo) {
		this.iEstilo = iEstilo;
	}

	public ITipoSoporte getTipoSoporte() {
		return iTipoSoporte;
	}

	public void setTipoSoporte(ITipoSoporte iTipoSoporte) {
		this.iTipoSoporte = iTipoSoporte;
	}

	@Type(type = "lv.dataaccess.util.DBBooleanValue")
	public Boolean getVideo() {
		return video;
	}

	public void setVideo(Boolean video) {
		this.video = video;
	}

	public String getLeyenda() {
		return leyenda;
	}

	public void setLeyenda(String leyenda) {
		this.leyenda = leyenda;
	}

	@Type(type = "lv.dataaccess.util.DBBooleanValue")
	public Boolean getObraConceptual() {
		return obraConceptual;
	}

	public void setObraConceptual(Boolean obraConceptual) {
		this.obraConceptual = obraConceptual;
	}

	public IColeccion getColeccion() {
		return coleccion;
	}

	public void setColeccion(IColeccion iColeccion) {
		this.coleccion = iColeccion;
	}

	public String getUbicacion() {
		return ubicacion;
	}

	public void setUbicacion(String ubicacion) {
		this.ubicacion = ubicacion;
	}

	@Override
	public List<IIngeniero> getIngenieros() {
		return ingenieros;
	}

	@Override
	public void setIngenieros(List<IIngeniero> ingenieros) {
		this.ingenieros = ingenieros;
	}

	@Override
	public List<ITversion> getVersiones() {
		return versiones;
	}

	@Override
	public void setVersiones(List<ITversion> versiones) {
		this.versiones = versiones;
	}

	@Override
	public Integer getIdDisco() {
		return idDisco;
	}

	@Override
	public void setIdDisco(Integer idDisco) {
		this.idDisco = idDisco;
	}
}